/**
 * CORBA SERVER PROVIDING ONE REMOTE SERVICE TO THE RMI SERVER
 * USE THE COMMAND INTERFACE TO PRINT THE TRACE OF ACTIVITIES OF THIS SERVER
 */
package corbaServer;

import org.omg.CORBA.ORB;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import corbaServer.corba.CorbaServer;
import corbaServer.corba.ICorbaServer;
import corbaServer.corba.ICorbaServerHelper;

public class CorbaEventServer
{

	public static void main(String[] args)
	{	
		if(args.length < 1 || !( args[0].equals("Madrid") || args[0].equals("Bilbao") ) )
		{
			System.out.println("ERROR: Debe especificar 'Madrid' o 'Bilbao' por parámetro.");
			return;
		}
		try
		{
			String[] orb_args = new String[4];
			if ( args[0].equals("Madrid") )
			{
				orb_args[0] = "-ORBInitialHost";
				orb_args[1] = util.Settings.MADRID_EVENTS_CORBA_SERVER_IP;
				orb_args[2] = "-ORBInitialPort";
				orb_args[3] = util.Settings.MADRID_EVENTS_CORBA_SERVER_PORT;
			}
			else if (args[0].equals("Bilbao"))
			{
				orb_args[0] = "-ORBInitialHost";
				orb_args[1] = util.Settings.BILBAO_EVENTS_CORBA_SERVER_IP;
				orb_args[2] = "-ORBInitialPort";
				orb_args[3] = util.Settings.BILBAO_EVENTS_CORBA_SERVER_PORT;
			}
			//Crear un objeto ORB.
			ORB orb = ORB.init(orb_args, null);
			//Obtener una referencia al objeto POA.
			org.omg.CORBA.Object reference = orb.resolve_initial_references("RootPOA");
			
			//Convertir la referencia genérica a una específica para el objeto POA. 
			POA poa = POAHelper.narrow(reference);
			//Activar el POAManager. 
			poa.the_POAManager().activate();
			
			//Crear los objetos CORBA.
			CorbaServer corbaServer = null;
			if ( args[0].equals("Madrid") )
			{
				corbaServer = new CorbaServer("Madrid");
			}
			else if (args[0].equals("Bilbao"))
			{
				corbaServer = new CorbaServer("Bilbao");
			}
			
			//Registrar el objeto en el POA y obtener la referencia asignada por él.
			org.omg.CORBA.Object ref = poa.servant_to_reference(corbaServer);
			//Convertir la referencia genérica a una específica del interfaz IDL del objeto CORBA.
			ICorbaServer getEventsRef = ICorbaServerHelper.narrow(ref);
			
			//Obtener una referencia al servicio de nombres de CORBA.
			org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
			//Transformar la referencia genérica a una específica para el servicio de nombres.
			NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
			
			//Registrar el objeto CORBA en el servicio de nombres. 
			String name = null;
			if ( args[0].equals("Madrid") )
			{
				name = "MadridEvents";
			}
			else if (args[0].equals("Bilbao"))
			{
				name = "BilbaoEvents";
			}
            NameComponent[] path = ncRef.to_name(name);
            ncRef.rebind(path, getEventsRef);
            
            //Dejar el servidor esperando peticiones de los clientes. 
            System.out.println ("CorbaEventServer " + name + " preparado y esperando peticiones..."); // registro
            orb.run();
		} 
		catch(Exception e) 
		{
            System.err.println("ERROR: " + e);
            e.printStackTrace(System.err);
		}
		
	}
}
